package com.chenjiajin.feign;


import com.chenjiajin.config.OpenFeignConfig;
import com.chenjiajin.domain.Logtest;
import feign.Response;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * feign代码写在服务发起方
 *
 * @author chenjiajin
 * @date 2022/4/11
 */
@FeignClient(name = "daughter", configuration = OpenFeignConfig.class)  // name的名称一定要和被调用方服务的名称保持一致
public interface FeignService {

    /**
     * 参数 String
     * 返回值 String
     */
    @RequestMapping("/string")
    String string(@RequestParam String string);   //String类型 无论是Feign接口还是真实接口 @RequestParam注解有没有都可以

    @RequestMapping("/doubleString")
    String doubleString(@RequestParam String string, @RequestParam String name);
    //两个String类型:
    // 如果基本类型或者String参数有多个 调用方的Feign方法形式参数必须加@RequestParam注解
    // 否则出现异常: Caused by: java.lang.IllegalStateException:
    //                      Method has too many Body parameters: ......


    /**
     * 参数是JavaBean
     * 返回值是JavaBean
     */
    @RequestMapping("/feign1")
    Logtest feign1(@RequestBody Logtest logtest);  //对象和map需要贴RequestBody注解


    /**
     * 参数是Map<String, JavaBean>
     * 返回值是JavaBean
     */
    @RequestMapping("/feign2")
    Logtest feign2(@RequestBody Map<String, Logtest> map);


    /**
     * 参数是Map<String,String>
     * 返回值是JavaBean
     */
    @RequestMapping("/feign3")
    Logtest feign3(@RequestBody Map<String, String> map);
    // Map<String, String>  可以使用 @RequestParam  , 也可以使用 @RequestBody
    // Map<String, Logtest> 不能使用 @RequestParam  , 只能使用 @RequestBody


    /**
     * 参数是JavaBean
     * 返回值是Map<String,String>
     */
    @RequestMapping("/feign4")
    Map<String, String> feign4(@RequestBody Logtest logtest);


    /**
     * 参数是JavaBean
     * 返回值是Map<String,JavaBean>
     */
    @RequestMapping("/feign5")
    Map<String, Logtest> feign5(@RequestBody Logtest logtest);


    /**
     * 参数是JavaBean
     * 返回值是List<String>
     */
    @RequestMapping("/feign6")
    List<String> feign6(Logtest logtest);


    /**
     * 参数是JavaBean
     * 返回值是List<JavaBean>
     */
    @RequestMapping("/feign7")
    List<Logtest> feign7(Logtest logtest);

    /**
     * 参数是List<JavaBean>
     * 返回值是List<JavaBean>
     */
    @RequestMapping("/feign8")
    List<Logtest> feign8(@RequestBody List<Logtest> list);

    /**
     * 测试Bug
     * 远程接口传递的参数为null时的异常
     */
    //@GetMapping("/testBug")
    //String testBug(@RequestParam Long i);
    @GetMapping("/testBug/{i}")
    String testBug(@PathVariable("i") Long i);


    /**
     * 测试Bug
     * 超时时间默认1秒
     */
    @RequestMapping("/testTime")
    String testTime();


    /**
     * 远程调用 文件下载
     */
    @GetMapping("/download")
    Response download(@RequestParam String path);


    /**
     * Date类型 传输
     */
    @PostMapping("/feign9")
    Date feign9(@RequestBody Date date);


    /**
     * Date类型 作为对象的属性传输, 没问题
     */
    @RequestMapping("/feign10")
    Logtest feign10(@RequestBody Logtest logtest);
}
